document.addEventListener('DOMContentLoaded', function() {
    // 获取DOM元素
    const jsonInput = document.getElementById('json-input');
    const jsonOutput = document.getElementById('json-output');
    const formatBtn = document.getElementById('format-btn');
    const clearBtn = document.getElementById('clear-btn');
    const copyBtn = document.getElementById('copy-btn');
    const editBtn = document.getElementById('edit-btn');
    const saveBtn = document.getElementById('save-btn');
    const cancelBtn = document.getElementById('cancel-btn');
    const editActions = document.querySelector('.edit-actions');
    const errorMessage = document.getElementById('error-message');
    const copyNotification = document.getElementById('copy-notification');
    const shareNotification = document.getElementById('share-notification');
    const themeSwitch = document.getElementById('theme-switch');
    const privacyNotice = document.getElementById('privacy-notice');
    const closeNoticeBtn = document.getElementById('close-notice');
    const shareButton = document.getElementById('share-button');
    
    // 保存原始格式化内容
    let originalFormattedContent = '';
    
    // 标记用户输入方式
    let isPasted = false;
    
    // 检查本地存储中的主题设置
    if (localStorage.getItem('theme') === 'dark') {
        document.documentElement.setAttribute('data-theme', 'dark');
        themeSwitch.checked = true;
    }
    
    // 主题切换功能
    themeSwitch.addEventListener('change', function() {
        if (this.checked) {
            document.documentElement.setAttribute('data-theme', 'dark');
            localStorage.setItem('theme', 'dark');
        } else {
            document.documentElement.removeAttribute('data-theme');
            localStorage.setItem('theme', 'light');
        }
    });
    
    // 隐私提示框关闭功能
    closeNoticeBtn.addEventListener('click', function() {
        privacyNotice.style.display = 'none';
        // 记住用户已关闭提示，使用localStorage存储状态
        localStorage.setItem('privacyNoticeClosed', 'true');
    });
    
    // 检查是否需要显示隐私提示
    if (localStorage.getItem('privacyNoticeClosed') === 'true') {
        privacyNotice.style.display = 'none';
    }
    
    // 格式化JSON
    function formatJSON() {
        const inputValue = jsonInput.value.trim();
        
        // 清空之前的错误信息和输出
        errorMessage.textContent = '';
        jsonOutput.textContent = '';
        
        if (!inputValue) {
            errorMessage.textContent = '请输入JSON数据';
            return;
        }
        
        try {
            // 显示加载状态（对于大文件）
            if (inputValue.length > 10000) {
                jsonOutput.textContent = '正在格式化大文件，请稍候...';
            }
            
            // 使用setTimeout避免阻塞UI
            setTimeout(() => {
                try {
                    // 尝试解析JSON
                    const parsedJSON = JSON.parse(inputValue);
                    
                    // 格式化并显示JSON
                    const formattedJSON = JSON.stringify(parsedJSON, null, 4);
                    jsonOutput.textContent = formattedJSON;
                    
                    // 添加语法高亮（优化实现）
                    applyHighlighting();
                } catch (error) {
                    // 显示错误信息
                    errorMessage.textContent = `JSON格式错误: ${error.message}`;
                    jsonOutput.textContent = '';
                }
            }, inputValue.length > 10000 ? 100 : 0);
            
        } catch (error) {
            // 显示错误信息
            errorMessage.textContent = `JSON格式错误: ${error.message}`;
        }
    }
    
    // 防抖函数
    function debounce(func, wait) {
        let timeout;
        return function executedFunction(...args) {
            const later = () => {
                clearTimeout(timeout);
                func(...args);
            };
            clearTimeout(timeout);
            timeout = setTimeout(later, wait);
        };
    }
    
    // 优化的语法高亮实现
    function applyHighlighting() {
        const content = jsonOutput.textContent;
        
        // 对于超长文本，跳过语法高亮以提升性能
        if (content.length > 50000) {
            jsonOutput.innerHTML = content;
            return;
        }
        
        // 使用DocumentFragment提升性能
        const fragment = document.createDocumentFragment();
        const tempDiv = document.createElement('div');
        
        let highlighted = content
            // 高亮键名
            .replace(/"([^"]+)"\s*:/g, '<span class="json-key">"$1"</span>:')
            // 高亮字符串值
            .replace(/:\s*"([^"]*)"/g, ': <span class="json-string">"$1"</span>')
            // 高亮数字
            .replace(/:\s*(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)/g, ': <span class="json-number">$1</span>')
            // 高亮布尔值和null
            .replace(/:\s*(true|false|null)/g, ': <span class="json-boolean">$1</span>');
        
        // 使用requestAnimationFrame优化渲染
        requestAnimationFrame(() => {
            jsonOutput.innerHTML = highlighted;
        });
    }
    
    // 复制到剪贴板
    function copyToClipboard() {
        if (!jsonOutput.textContent) {
            return;
        }
        
        // 创建临时文本区域
        const textarea = document.createElement('textarea');
        textarea.value = jsonOutput.textContent;
        document.body.appendChild(textarea);
        
        // 选择并复制文本
        textarea.select();
        document.execCommand('copy');
        
        // 移除临时文本区域
        document.body.removeChild(textarea);
        
        // 显示复制成功通知，鼓励用户分享
        copyNotification.textContent = '复制成功！';
        copyNotification.classList.add('show');
        setTimeout(() => {
            copyNotification.classList.remove('show');
        }, 2000);
    }
    
    // 清空输入和输出
    function clearAll() {
        jsonInput.value = '';
        jsonOutput.textContent = '';
        errorMessage.textContent = '';
    }
    
    // 进入编辑模式
    function enterEditMode() {
        // 保存原始内容以便取消时恢复
        originalFormattedContent = jsonOutput.innerHTML;
        
        // 创建一个可编辑的文本区域
        const textarea = document.createElement('textarea');
        textarea.id = 'json-edit-area';
        textarea.value = jsonOutput.textContent;
        textarea.style.width = '100%';
        textarea.style.height = '100%';
        textarea.style.fontFamily = '"Consolas", monospace';
        textarea.style.fontSize = '14px';
        textarea.style.padding = '12px';
        textarea.style.border = '1px solid var(--border-color)';
        textarea.style.borderRadius = '4px';
        textarea.style.backgroundColor = 'var(--card-background)';
        textarea.style.color = 'var(--text-color)';
        
        // 替换输出区域的内容
        jsonOutput.innerHTML = '';
        jsonOutput.appendChild(textarea);
        
        // 显示保存和取消按钮
        editActions.style.display = 'flex';
        
        // 隐藏编辑按钮，显示保存和取消按钮
        editBtn.style.display = 'none';
    }
    
    // 保存编辑内容
    function saveEdit() {
        const editArea = document.getElementById('json-edit-area');
        const editedContent = editArea.value;
        
        try {
            // 尝试解析JSON以确保格式正确
            const parsedJSON = JSON.parse(editedContent);
            
            // 格式化并显示JSON
            const formattedJSON = JSON.stringify(parsedJSON, null, 4);
            jsonOutput.textContent = formattedJSON;
            
            // 添加语法高亮
            applyHighlighting();
            
            // 退出编辑模式
            exitEditMode();
        } catch (error) {
            // 显示错误信息
            alert(`JSON格式错误: ${error.message}`);
        }
    }
    
    // 取消编辑
    function cancelEdit() {
        // 恢复原始内容
        jsonOutput.innerHTML = originalFormattedContent;
        
        // 退出编辑模式
        exitEditMode();
    }
    
    // 退出编辑模式
    function exitEditMode() {
        // 隐藏保存和取消按钮
        editActions.style.display = 'none';
        
        // 显示编辑按钮
        editBtn.style.display = 'inline-flex';
    }
    
    // 分享功能
    function shareURL() {
        // 创建临时文本区域
        const textarea = document.createElement('textarea');
        textarea.value = window.location.href;
        document.body.appendChild(textarea);
        
        // 选择并复制文本
        textarea.select();
        document.execCommand('copy');
        
        // 移除临时文本区域
        document.body.removeChild(textarea);
        
        // 显示分享成功通知
        shareNotification.classList.add('show');
        setTimeout(() => {
            shareNotification.classList.remove('show');
        }, 2000);
    }
    
    // 添加事件监听器
    formatBtn.addEventListener('click', formatJSON);
    clearBtn.addEventListener('click', clearAll);
    copyBtn.addEventListener('click', copyToClipboard);
    editBtn.addEventListener('click', enterEditMode);
    saveBtn.addEventListener('click', saveEdit);
    cancelBtn.addEventListener('click', cancelEdit);
    shareButton.addEventListener('click', shareURL);
    
    // 创建防抖的格式化函数
    const debouncedFormat = debounce(formatJSON, 300);
    
    // 监听粘贴事件
    jsonInput.addEventListener('paste', function(e) {
        isPasted = true;
        
        // 获取粘贴的数据大小
        const clipboardData = e.clipboardData || window.clipboardData;
        const pastedData = clipboardData.getData('text');
        
        // 对于大文件，显示提示
        if (pastedData.length > 50000) {
            // 显示处理提示
            setTimeout(() => {
                jsonOutput.textContent = '检测到大文件，正在处理中...';
            }, 0);
        }
        
        // 使用setTimeout确保在粘贴内容被插入后执行
        setTimeout(function() {
            // 对于大文件使用防抖，小文件立即处理
            if (pastedData.length > 10000) {
                debouncedFormat();
            } else {
                formatJSON();
            }
        }, 0);
    });
    
    // 监听键盘输入事件，如果用户开始手动输入，则标记为非粘贴
    jsonInput.addEventListener('input', function(e) {
        // 如果不是粘贴操作触发的input事件，则标记为手动输入
        if (!isPasted) {
            // 用户正在手动输入，需要点击按钮格式化
            // 清空输出区域的提示信息
            if (jsonOutput.textContent.includes('正在处理') || jsonOutput.textContent.includes('检测到大文件')) {
                jsonOutput.textContent = '';
            }
        } else {
            // 重置粘贴标记，为下一次操作做准备
            isPasted = false;
        }
    });
    
    // 添加键盘快捷键支持
    jsonInput.addEventListener('keydown', function(e) {
        // Ctrl+Enter 格式化
        if (e.ctrlKey && e.key === 'Enter') {
            formatJSON();
        }
    });
    
    // 添加CSS样式用于语法高亮
    const style = document.createElement('style');
    style.textContent = `
        .json-key { color: #2980b9; }
        .json-string { color: #27ae60; }
        .json-number { color: #e67e22; }
        .json-boolean { color: #8e44ad; }
        
        [data-theme="dark"] .json-key { color: #5dade2; }
        [data-theme="dark"] .json-string { color: #2ecc71; }
        [data-theme="dark"] .json-number { color: #f39c12; }
        [data-theme="dark"] .json-boolean { color: #bb8fce; }
    `;
    document.head.appendChild(style);
});